home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
ELECTRIC
/
DSPICE0S.ZIP
/
mosq2.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-11-22
|
8KB
|
234 lines
/* mosq2.f -- translated by f2c (version of 3 February 1990 3:36:42).
You must link the resulting object file with the libraries:
-lF77 -lI77 -lm -lc (in that order)
*/
#include "f2c.h"
/*< subroutine mosq2(vds,vbs,vgs,vdsat,vth,vbin,gamasd,cox,phi, >*/
/*< 1 qg,qc,qb,cggb,cgdb,cgsb,cbgb,cbdb,cbsb) >*/
/* Subroutine */ int mosq2_(vds, vbs, vgs, vdsat, vth, vbin, gamasd, cox, phi,
qg, qc, qb, cggb, cgdb, cgsb, cbgb, cbdb, cbsb)
doublereal *vds, *vbs, *vgs, *vdsat, *vth, *vbin, *gamasd, *cox, *phi, *qg, *
qc, *qb, *cggb, *cgdb, *cgsb, *cbgb, *cbdb, *cbsb;
{
/* System generated locals */
doublereal d_1;
/* Builtin functions */
double sqrt();
/* Local variables */
static doublereal argd, argn, ve1p5, ve2p5, vsat, vs1p5, vs2p5, argd2,
term0, term1, term2, term3, term4, term5, term6, term7, dddve,
dddvs, term10, term11, term12, term20, term21, term22, sqarg,
gamma2, vd, ve, vg, dgndve, vs, dqgdve, dvedvd, dvedvg, dgndvs,
ve2, ve3, ve5, vs2, vs3, vs5, vbd, vgb, vep5, vsp5;
/*< implicit double precision (a-h,o-z) >*/
/* initialize charges; */
/* change reference voltages for charge computation */
/*< qg=0.0d0 >*/
*qg = 0.;
/*< qb=0.0d0 >*/
*qb = 0.;
/*< vbd=vbs-vds >*/
vbd = *vbs - *vds;
/*< vgb=vgs-vbs >*/
vgb = *vgs - *vbs;
/*< vd=dmax1(phi-vbd,1.0d-8) >*/
/* Computing MAX */
d_1 = *phi - vbd;
vd = max(1e-8,d_1);
/*< vs=dmax1(phi-vbs,1.0d-8) >*/
/* Computing MAX */
d_1 = *phi - *vbs;
vs = max(1e-8,d_1);
/*< vg=vgb-vbin+phi >*/
vg = vgb - *vbin + *phi;
/*< vsp5=dsqrt(vs) >*/
vsp5 = sqrt(vs);
/* determine operating region */
/*< if (vgs.le.vth) go to 1100 >*/
if (*vgs <= *vth) {
goto L1100;
}
/* compute charges for "on" region */
/*< 1020 vsat=vdsat+vs >*/
/* L1020: */
vsat = *vdsat + vs;
/*< vs2=vs*vs >*/
vs2 = vs * vs;
/*< vs3=vs2*vs >*/
vs3 = vs2 * vs;
/*< vs5=vs3*vs2 >*/
vs5 = vs3 * vs2;
/*< vs1p5=vs*vsp5 >*/
vs1p5 = vs * vsp5;
/*< vs2p5=vs1p5*vs >*/
vs2p5 = vs1p5 * vs;
/*< 1025 if (vd.ge.vsat) go to 1035 >*/
/* L1025: */
if (vd >= vsat) {
goto L1035;
}
/*< ve=vd >*/
ve = vd;
/*< 1030 dvedvd=1.0d0 >*/
/* L1030: */
dvedvd = 1.;
/*< dvedvg=0.0d0 >*/
dvedvg = 0.;
/*< go to 1040 >*/
goto L1040;
/*< 1035 ve=vsat >*/
L1035:
ve = vsat;
/*< dvedvd=0.0d0 >*/
dvedvd = 0.;
/*< dvedvg=0.0d0 >*/
dvedvg = 0.;
/*< 1040 ve2=ve*ve >*/
L1040:
ve2 = ve * ve;
/*< ve3=ve2*ve >*/
ve3 = ve2 * ve;
/*< ve5=ve2*ve3 >*/
ve5 = ve2 * ve3;
/*< vep5=dsqrt(ve) >*/
vep5 = sqrt(ve);
/*< ve1p5=ve*vep5 >*/
ve1p5 = ve * vep5;
/*< ve2p5=ve1p5*ve >*/
ve2p5 = ve1p5 * ve;
/*< term0=ve+vs >*/
term0 = ve + vs;
/*< term1=vep5+vsp5 >*/
term1 = vep5 + vsp5;
/*< term2=vep5*vsp5 >*/
term2 = vep5 * vsp5;
/*< term3=ve2+vs2 >*/
term3 = ve2 + vs2;
/*< term4=ve*vs >*/
term4 = ve * vs;
/*< term5=term0*term1 >*/
term5 = term0 * term1;
/*< term6=(term3+term4)+term2*term0 >*/
term6 = term3 + term4 + term2 * term0;
/*< term7=(term3+term4)*term1 >*/
term7 = (term3 + term4) * term1;
/*< term10=vep5+0.5d0*vsp5 >*/
term10 = vep5 + vsp5 * .5;
/*< term11=1.5d0*ve+vsp5*term10 >*/
term11 = ve * 1.5 + vsp5 * term10;
/*< term12=2.0d0*ve1p5+vsp5*term11 >*/
term12 = ve1p5 * 2. + vsp5 * term11;
/*< term20=0.5d0*vep5+vsp5 >*/
term20 = vep5 * .5 + vsp5;
/*< term21=1.5d0*vs+vep5*term20 >*/
term21 = vs * 1.5 + vep5 * term20;
/*< term22=2.0d0*vs1p5+vep5*term21 >*/
term22 = vs1p5 * 2. + vep5 * term21;
/*< argn=0.5d0*vg*term5-0.4d0*gamasd*term6-term7/3.0d0 >*/
argn = vg * .5 * term5 - *gamasd * .4 * term6 - term7 / 3.;
/*< argd=vg*term1-gamasd*(term0+term2)/1.5d0-0.5d0*term1*term0 >*/
argd = vg * term1 - *gamasd * (term0 + term2) / 1.5 - term1 * .5 * term0;
/*< argd2=argd*argd >*/
argd2 = argd * argd;
/*< qg=cox*(vg-argn/argd) >*/
*qg = *cox * (vg - argn / argd);
/*< dgndve=0.5d0*vg*term11-0.4d0*gamasd*term12- >*/
/*< 1 (2.5d0*ve2+vsp5*term12)/3.0d0 >*/
dgndve = vg * .5 * term11 - *gamasd * .4 * term12 - (ve2 * 2.5 + vsp5 *
term12) / 3.;
/*< dddve=0.5d0*vg-gamasd*term10/1.5d0-0.5d0*term11 >*/
dddve = vg * .5 - *gamasd * term10 / 1.5 - term11 * .5;
/*< dqgdve=-cox/argd*(dgndve-(vg-qg/cox)*dddve) >*/
dqgdve = -(*cox) / argd * (dgndve - (vg - *qg / *cox) * dddve);
/*< dgndvs=0.5d0*vg*term21-0.4d0*gamasd*term22- >*/
/*< 1 (2.5d0*vs2+vep5*term22)/3.0d0 >*/
dgndvs = vg * .5 * term21 - *gamasd * .4 * term22 - (vs2 * 2.5 + vep5 *
term22) / 3.;
/*< dddvs=0.5d0*vg-gamasd*term20/1.5d0-0.5d0*term21 >*/
dddvs = vg * .5 - *gamasd * term20 / 1.5 - term21 * .5;
/*< cgdb=-cox/(argd*vep5)*(dgndve-(vg-qg/cox)*dddve)*dvedvd >*/
*cgdb = -(*cox) / (argd * vep5) * (dgndve - (vg - *qg / *cox) * dddve) *
dvedvd;
/*< cgsb=-cox/(argd*vsp5)*(dgndvs-(vg-qg/cox)*dddvs) >*/
*cgsb = -(*cox) / (argd * vsp5) * (dgndvs - (vg - *qg / *cox) * dddvs);
/*< cggb=cox*(1.0d0-term1/argd*(0.5d0*term0-vg+qg/cox)) >*/
*cggb = *cox * (1. - term1 / argd * (term0 * .5 - vg + *qg / *cox));
/*< argn=vg*(term0+term2)/1.5d0-0.5d0*gamasd*term5-0.4d0*term6 >*/
argn = vg * (term0 + term2) / 1.5 - *gamasd * .5 * term5 - term6 * .4;
/*< dgndve=vg*term10/1.5d0-0.5d0*gamasd*term11-0.4d0*term12 >*/
dgndve = vg * term10 / 1.5 - *gamasd * .5 * term11 - term12 * .4;
/*< dgndvs=vg*term20/1.5d0-0.5d0*gamasd*term21-0.4d0*term22 >*/
dgndvs = vg * term20 / 1.5 - *gamasd * .5 * term21 - term22 * .4;
/*< qb=-gamasd*cox*argn/argd >*/
*qb = -(*gamasd) * *cox * argn / argd;
/*< cbdb=-cox/(vep5*argd)*(qb/cox*dddve+gamasd*dgndve)*dvedvd >*/
*cbdb = -(*cox) / (vep5 * argd) * (*qb / *cox * dddve + *gamasd * dgndve)
* dvedvd;
/*< cbsb=-cox/(vsp5*argd)*(qb/cox*dddvs+gamasd*dgndvs) >*/
*cbsb = -(*cox) / (vsp5 * argd) * (*qb / *cox * dddvs + *gamasd * dgndvs);
/*< cbgb=-cox/argd*(gamasd*(term0+term2)/1.5d0+qb/cox*term1) >*/
*cbgb = -(*cox) / argd * (*gamasd * (term0 + term2) / 1.5 + *qb / *cox *
term1);
/*< go to 2000 >*/
goto L2000;
/* finish special cases */
/*< 1100 if (vg.gt.0.0d0) go to 1110 >*/
L1100:
if (vg > 0.) {
goto L1110;
}
/*< qg=cox*vg >*/
*qg = *cox * vg;
/*< cggb=cox >*/
*cggb = *cox;
/*< go to 1120 >*/
goto L1120;
/*< 1110 gamma2=gamasd*0.5d0 >*/
L1110:
gamma2 = *gamasd * .5;
/*< sqarg=dsqrt(gamma2*gamma2+vg) >*/
sqarg = sqrt(gamma2 * gamma2 + vg);
/*< qg=gamasd*cox*(sqarg-gamma2) >*/
*qg = *gamasd * *cox * (sqarg - gamma2);
/*< cggb=0.5d0*cox*gamasd/sqarg >*/
*cggb = *cox * .5 * *gamasd / sqarg;
/*< 1120 qb=-qg >*/
L1120:
*qb = -(*qg);
/*< cbgb=-cggb >*/
*cbgb = -(*cggb);
/*< cgdb=0.0d0 >*/
*cgdb = 0.;
/*< cgsb=0.0d0 >*/
*cgsb = 0.;
/*< cbdb=0.0d0 >*/
*cbdb = 0.;
/*< cbsb=0.0d0 >*/
*cbsb = 0.;
/* finished */
/*< 2000 qc=-(qg+qb) >*/
L2000:
*qc = -(*qg + *qb);
/*< 2050 return >*/
/* L2050: */
return 0;
/*< end >*/
} /* mosq2_ */